home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 272_01 / dump.c < prev    next >
Text File  |  1987-03-14  |  5KB  |  151 lines

  1. /*
  2. **                HEX FILE DUMP UTILITY
  3. **   Displays any file in hex and character representation
  4. **   in color or monochrome, depending upon type of video
  5. **   card installed.  Displays 20 lines per screen and waits
  6. **   for a keypress.
  7. **
  8. **   This program was originally distributed by Datalight with
  9. **   the Datalight C Developer's Kit.  The program has been
  10. **   extensively modified by Steven E. Margison, Downers Grove, IL.
  11. **   It is placed into the public domain by S.E. Margison, with the
  12. **   understanding of all users that portions may be copyrighted
  13. **   by Datalight and/or others.  No charge may be made for this
  14. **   program under any circumstances.  Exception: a copying charge
  15. **   may be made if this program is included on a disk with other
  16. **   PD or shareware programs.
  17. **
  18. **   Rev 1.10   3-16-87  S.E. Margison
  19. **
  20. **   As distributed, this program requires (for compilation):
  21. **     "Steve's Datalight Library" version 1.10 or later
  22. **   which may be obtained without registration from many Bulletin
  23. **   Board Systems including:
  24. **      Compuserve IBMSW
  25. **      Cul-De-Sac (Holliston, MA.)
  26. **      HAL-PC BBS (Houston, TX.)
  27. **   and software library houses including:
  28. **      Public (Software) Library (Houston, TX.)
  29. **
  30. **   or by registration:
  31. **      $10 for Docs, Small Model Library
  32. **      $25 for Docs, S, D, L, P libraries, and complete library source
  33. **              in C and Assembler
  34. **     Steven E. Margison
  35. **     124 Sixth Street
  36. **     Downers Grove, IL, 60515
  37. **
  38. **
  39. ** Program requires at least one parameter, the name of the file to dump.
  40. ** A second parameter is taken to be an offset value to start dumping,
  41. ** default is the start of the file.  If a third value is present it is
  42. ** taken to be a hex byte value to highlite whenever encountered in the file.
  43. */
  44.  
  45. #include <stdio.h>
  46. #include <ctype.h>
  47. #include <smdefs.h>
  48. #include <screen.h>
  49.  
  50. int adrclr,    /* address field color */
  51.     hexclr,    /* hex data color */
  52.     highclr,   /* highlite color */
  53.     prompt,    /* prompt line color */
  54.     ascclr;    /* ascii color */
  55.  
  56. main(argc,argv)
  57. int argc;
  58. char *argv[];
  59. {
  60.    FILE *f;
  61.    int i, buffer[16], lines, view, vflag;
  62.    unsigned long offset = 0;
  63.  
  64.    vflag = NO;      /* default highlite off */
  65.  
  66.    if ((argc < 2) or (argc > 4))
  67.       error("Use: dump file [starting offset in hex] [highlite byte]");
  68.  
  69.    if((f = fopen(argv[1], "rb")) is NULL) cant(argv[1]);
  70.  
  71.    if (argc > 2) {  /* get an offset if so indicated */
  72.       sscanf(argv[2],"%lx",&offset);
  73.       fseek(f,offset,0);
  74.       }
  75.  
  76.    if (argc is 4) {  /* get the value to highlite */
  77.       sscanf(argv[3], "%02x", &view);
  78.       vflag = YES;
  79.       }
  80.  
  81.    i = stuff(0);   /* check video type */
  82.    if(i is MONO) {
  83.       prompt = BLINKING;
  84.       adrclr = WHITE;
  85.       hexclr = HIWHITE;
  86.       ascclr = WHITE;
  87.       highclr = HIGHBLINK;
  88.       }
  89.    else {         /* for CGA cards */
  90.       prompt = BROWN;
  91.       adrclr = LTGREEN;
  92.       hexclr = YELLOW;
  93.       ascclr = LTCYAN;
  94.       highclr = HIWHITE;
  95.       }
  96.  
  97.    disp_open();    /* use Datalight direct video access routines */
  98.    disp_cls();
  99.    disp_move(0,0);
  100.    disp_flush();
  101.    lines = 20;
  102.    while (TRUE) {
  103.       for (i = 0; i < 16; i++) buffer[i] = fgetc(f);
  104.       if (buffer[0] == -1) break;   /* done */
  105.       disp_setattr(adrclr);   /* set address color */
  106.       disp_printf("%04lx: ",offset);  /* display address */
  107.       disp_setattr(hexclr);   /* set hex value color */
  108.       for (i = 0; i < 16; i++) {
  109.          if (buffer[i] != -1) {
  110.             if(vflag and (buffer[i] is view)) {  /* highlite this byte? */
  111.                disp_setattr(highclr);
  112.                disp_printf("%02x ", buffer[i]);
  113.                disp_setattr(hexclr);
  114.                }
  115.             else disp_printf("%02x ", buffer[i]);
  116.             }
  117.          else disp_puts("   ");
  118.          }
  119.       disp_setattr(ascclr);  /* display ascii data color */
  120.       disp_puts("   ");
  121.       for (i = 0; i < 16; i++) {
  122.          if (buffer[i] != -1) {
  123.             if (!isprint(buffer[i])) buffer[i] = '.';
  124.             disp_putc(buffer[i]);
  125.             }
  126.          else disp_putc(' ');
  127.          }
  128.       disp_putc('\n');
  129.       if(lines-- is 0) {
  130.          disp_setattr(prompt);
  131.          disp_say(22, 10, "Press any key to continue...");
  132.          getkey();
  133.          disp_cls();
  134.          disp_flush();
  135.          lines = 20;
  136.          }
  137.       offset += 16;
  138.       }  /* end of while */
  139.    disp_setattr(prompt);
  140.    disp_say(22, 10, "End of File Encountered");
  141.    disp_flush();
  142. }
  143.  
  144.  
  145. disp_puts(buf)
  146. char *buf;
  147. {
  148.    while(*buf isnot NULL) disp_putc(*buf++);
  149. }
  150.  
  151.